package terra.network.packet.server;

import org.jboss.netty.buffer.ChannelBuffer;

import terra.network.packet.Packet;

/**
 * 32*32 = 1024 объекта
 * 1+4+(4+4+4+1)*1024 = 13317 байт в максимуме.
 * 16*16 = 256 объектов
 * 1+4+(4+4+4+1)*256 = 3333 байт в максимуме
 *
 */
public class ChunkInfo extends Packet {
	public static final int size = 32;
	
	public int x, y;
	//координаты данной ячейки относительно полного массива 16х16. 
	//например координата 256 говорит о том, что тайл находится в последней ячейке [16][16]
	public short[] coords;//2*256
	public short[] ids; //2*256
	public short[] hps; //2*256
	public float[] masses; //4*256
	public byte[] types;	//256
	String hash;
	public ChunkInfo(int x1, int y1) {
		x = x1;
		y = y1;
	}

	public ChunkInfo() {
	}

	public void init(int length){
		coords = new short[length];
		ids = new short[length];
		hps = new short[length];
		masses = new float[length];
		types = new byte[length];
	}
	
	@Override
	public ChannelBuffer toBuffer() {
		ChannelBuffer buf = getNewBuffer(1+4+8+coords.length*3*2 + masses.length*4+ types.length);
		buf.writeByte(getId());
		buf.writeInt(coords.length*3*2 + masses.length*4+ types.length+8);
		buf.writeInt(x);
		buf.writeInt(y);
		for(int i = 0; i < ids.length;i++) {
			buf.writeShort(coords[i]);
			buf.writeShort(ids[i]);
			buf.writeShort(hps[i]);
			buf.writeFloat(masses[i]);
			buf.writeByte(types[i]);
		}
		return buf;
	}

	@Override
	public Packet fromBuffer(ChannelBuffer buf) {
		int length = buf.readInt()-8; 
		x = buf.readInt();
		y = buf.readInt();
		coords = new short[length/11];
		ids = new short[length/11];
		hps = new short[length/11];
		masses = new float[length/11];
		types = new byte[length/11];

		for(int i = 0; i < length/11;i++) {
			coords[i] = buf.readShort();
			ids[i] = buf.readShort();
			hps[i] = buf.readShort();		
			masses[i] = buf.readFloat();	
			types[i] = buf.readByte();	
		}
		return this;
	}

	@Override
	public int getLength() {
		return 0;
	}

	@Override
	public boolean isDynamicLength() {
		return true;
	}

	@Override
	public byte getId() {
		return 13;
	}
	
	@Override
	public byte getPriority() {
		return PRIOR_LOW;
	}
	
	public String toString(){
		return "ChunkInfo xy = "+x+" / "+ y;
	}
}
